home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / plugin / ship / game.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-03  |  7.3 KB  |  312 lines

  1. #include "game.h"
  2.  
  3. ship_desc cd_ship;
  4. turret_desc cd_turret;
  5. robot_desc cd_robot;
  6. powerup_desc cd_powerup;
  7. container_desc cd_container;
  8.  
  9. void init_scene();
  10. void mp_message(int from,mp_msg *msg);
  11.  
  12. BOOL APIENTRY DllMain(HINSTANCE hModule, 
  13.                       DWORD  ul_reason_for_call, 
  14.                       LPVOID lpReserved)
  15. {    
  16.     switch( ul_reason_for_call ) 
  17.     {
  18.     case DLL_PROCESS_ATTACH:
  19.     case DLL_THREAD_ATTACH:
  20.     case DLL_THREAD_DETACH:
  21.     case DLL_PROCESS_DETACH:
  22.         break;
  23.     }
  24.     return TRUE;
  25. }
  26.  
  27. __declspec( dllexport ) 
  28. int num_classes() 
  29. {
  30.     return 5;
  31. }
  32.  
  33. __declspec( dllexport ) 
  34. class_desc *get_class_desc(int i) 
  35. {
  36.     switch(i) 
  37.     {
  38.     case 0: return &cd_powerup;
  39.     case 1: return &cd_ship;
  40.     case 2: return &cd_turret;
  41.     case 3: return &cd_robot;
  42.     case 4: return &cd_container;
  43.     default: return 0;
  44.     }
  45. }
  46.  
  47. __declspec( dllexport )
  48. int fly_message(int msg,int param,void *data)
  49. {
  50.     switch(msg)
  51.     {
  52.     case FLYM_DRAWSCENE:
  53.     if (directx->mpmode!=FLYMP_SERVER)
  54.         {
  55.         ship *s=(ship *)(flyengine->cam);
  56.         if (s->flag2)
  57.             {
  58.             vector dir=s->expcam.pos-s->pos;
  59.             dir.normalize();
  60.             s->expcam.pos=s->expcam.pos;
  61.             s->expcam.rotate(s->expcam.Z,dir);
  62.             flyengine->set_camera(&s->expcam);
  63.             flyengine->draw_bsp();
  64.             flyengine->set_camera(s);
  65.             }
  66.         else 
  67.             {
  68.             flyengine->set_camera(s);
  69.             flyengine->draw_bsp();
  70.             }
  71.         }
  72.         break;
  73.     case FLYM_DRAWTEXT:
  74.         ((ship *)(flyengine->cam))->draw_game_status();
  75.         break;
  76.     case FLYM_MPUPDATE:
  77.         ((ship *)(flyengine->cam))->mp_send_pos(
  78.             FLYMP_MSG_POS,
  79.             0xf|
  80.             ((ship *)(flyengine->cam))->flag|
  81.             (((ship *)(flyengine->cam))->points<<16));
  82.         return 0;
  83.     case FLYM_MPMESSAGE:
  84.         mp_message(param,(mp_msg *)data);
  85.         return 0;
  86.     case FLYM_INITSCENE:
  87.         init_scene();
  88.         break;
  89.     case FLYM_CLOSESCENE:
  90.         break;
  91.     }
  92.     return 1;
  93. }
  94.  
  95. void mp_message(int from,mp_msg *msg)
  96. {    
  97.     switch( msg->type )
  98.         {
  99.         case FLYMP_MSG_POS:
  100.             {
  101.                 mp_data *data=(mp_data *)&msg->type;
  102.                 ship *s=(ship *)directx->players[from].data;
  103.                 if (from>0)
  104.                     {
  105.                     s->remove_from_bsp();
  106.                     s->pos=data->pos;
  107.                     s->vel=data->vel;
  108.                     s->Y=data->Y;
  109.                     s->Z=data->Z;
  110.                     s->X.cross(s->Y,s->Z);
  111.                     s->flag=data->flag&0xffff;
  112.                     s->points=data->flag>>16;
  113.                     s->update_mat();
  114.                     s->add_to_bsp();
  115.                     }
  116.                 if (from>=0 && ((data->flag&0xf)!=0xf))
  117.                     {
  118.                     if (s->g[data->flag&0xf])
  119.                         s->g[data->flag&0xf]->fire(s,from);
  120.                     if (data->flag&0x10)
  121.                         s->speedboost=s->speedboost0;
  122.                     else s->speedboost=0;
  123.                     }
  124.             }
  125.             break;
  126.         case FLYMP_MSG_DAMAGE:
  127.             {
  128.                 mp_data2 *data=(mp_data2 *)&msg->type;
  129.                 ship *s=(ship *)directx->players[from].data;
  130.                 s->force+=data->v;
  131.                 s->shield-=data->f;
  132.                 s->lasthittime=flyengine->cur_time;
  133.                 s->lasthitfrom=from;
  134.                 if (from==0)
  135.                     flyengine->filter.x+=data->f>1.0f?1.0f:data->f;
  136.             }
  137.             break;
  138.         case FLYMP_MSG_KILL:
  139.             {
  140.                 mp_data *data=(mp_data *)&msg->type;
  141.                 ship *s=(ship *)directx->players[from].data;
  142.                 s->flag2=s->exptime;
  143.                 s->expcam.pos=s->pos;
  144.                 s->expcam.node=s->node;
  145.                 *((local_system *)&s->expcam)=*((local_system *)s);
  146.                 int i;
  147.                 for( i=0;i<directx->nplayers;i++ )
  148.                     if (directx->players[i].dpid==data->flag)
  149.                         break;
  150.                 if (from==i)
  151.                     if (i==0)
  152.                         {
  153.                         flyengine->set_status_msg("YOU COMMITTED SUICIDE",directx->players[i].name);
  154.                         ((ship *)flyengine->cam)->points--;
  155.                         }
  156.                     else
  157.                         flyengine->set_status_msg("%s COMMITTED SUICIDE",directx->players[i].name);
  158.                 else
  159.                     if (i==0)
  160.                         {
  161.                         ((ship *)flyengine->cam)->points++;
  162.                         flyengine->set_status_msg("YOU KILLED %s",directx->players[from].name);
  163.                         }
  164.                     else 
  165.                     if (from==0)
  166.                         flyengine->set_status_msg("%s KILLED YOU",directx->players[i].name);
  167.                     else 
  168.                         flyengine->set_status_msg("%s KILLED %s",directx->players[i].name,directx->players[from].name);
  169.             }
  170.             break;
  171.         case FLYMP_MSG_EXPLODE:
  172.             {
  173.                 mp_data *data=(mp_data *)&msg->type;
  174.                 ship *s=(ship *)directx->players[from].data;
  175.                 if (s->exp) 
  176.                     s->exp->do_explode(data->pos,data->Z,from);
  177.                 s->flag2--;
  178.                 s->remove_from_bsp();
  179.             }
  180.             break;
  181.         case FLYMP_MSG_JOIN:
  182.             {
  183.                 player_data *data=(player_data *)&msg->type;
  184.                 ship *s=(ship *)flyengine->cam->clone();
  185.                 s->pos.null(); s->vel.null(); s->force.null();
  186.                 s->player=directx->add_player(data->name,data->dpid,s);
  187.                 flyengine->set_status_msg("%s HAS JOINED THE GAME",data->name);
  188.                 flyengine->activate(s,(directx->mpmode==FLYMP_SERVER));
  189.                 if (directx->mpmode==FLYMP_SERVER)
  190.                 {
  191.                     powerup *p=0;
  192.                     while( p=(powerup *)flyengine->get_next_active_object(p,TYPE_POWERUP) )
  193.                     {
  194.                         static mp_data d;
  195.                         d.type=FLYMP_MSG_POWERUPMOVE;
  196.                         d.dpid=DPID_SERVERPLAYER;
  197.                         d.flag=p->valuetype;
  198.                         d.pos=p->pos;
  199.                         directx->send_message((mp_msg *)&d,sizeof(mp_data),data->dpid);
  200.                     }
  201.                 }
  202.             }
  203.             break;
  204.         case FLYMP_MSG_QUIT:
  205.             {
  206.                 player_data *data=(player_data *)&msg->type;
  207.                 if (from<directx->nplayers)
  208.                     {
  209.                     flyengine->set_status_msg("%s HAS LEFT THE GAME",directx->players[from].name);
  210.                     bsp_object *obj=(bsp_object *)directx->remove_player(from);
  211.                     for( int i=from;i<directx->nplayers;i++ )
  212.                         ((ship *)directx->players[i].data)->player=i;
  213.                     if (obj) obj->life=-1;
  214.                     }
  215.             }
  216.             break;
  217.         case FLYMP_MSG_POWERUPMOVE:
  218.             {
  219.                 mp_data *data=(mp_data *)&msg->type;
  220.                 powerup *p=0;
  221.                 while(p=(powerup *)flyengine->get_next_active_object(p,TYPE_POWERUP))
  222.                     if (p->valuetype==(int)data->flag)
  223.                         break;
  224.                 if (p)
  225.                     {
  226.                     p->pos=data->pos;
  227.                     p->life=p->source->life;
  228.                     }
  229.             }
  230.             break;
  231.         case FLYMP_MSG_POWERUPGET:
  232.             {
  233.                 mp_data *data=(mp_data *)&msg->type;
  234.                 powerup *p=0;
  235.                 while(p=(powerup *)flyengine->get_next_active_object(p,TYPE_POWERUP))
  236.                     if (p->valuetype==(int)data->flag)
  237.                         break;
  238.                 if (p)
  239.                     p->powerup_get((ship *)directx->players[from].data);
  240.             }
  241.             break;
  242.         }
  243. }
  244.  
  245. void missile_find(void *data,bsp_object *e)
  246. {
  247.     static vector v,hitip;
  248.     static float f;
  249.     static int hitface;
  250.     missile *t=(missile *)data;
  251.  
  252.     if (e->type==TYPE_SHIP || (e->type==TYPE_ROBOT && t->player!=-1))
  253.         {
  254.         if (e->type==TYPE_SHIP && t->player==((ship *)e)->player)
  255.             return;
  256.         v=e->pos-t->pos;
  257.         f=v.length();
  258.         if (f<t->lookrange && f<t->enemydist)
  259.             {
  260.             v/=f;
  261.             if (vec_dot(v,t->Z)<t->lookangle)
  262.                 return;
  263.             
  264.             if (flyengine->collision_test(flyengine->bsp,t->pos,e->pos,TYPE_STATIC_MESH))
  265.                 return;
  266.  
  267.             t->enemydist=f;
  268.             t->enemy=e;
  269.             }
  270.         }
  271. }
  272.  
  273. void mine_find(void *data,bsp_object *e)
  274. {
  275.     static vector v,hitip;
  276.     static float f;
  277.     static int hitface;
  278.     mine *t=(mine *)data;
  279.  
  280.     if (e->type==TYPE_SHIP || (e->type==TYPE_ROBOT && t->player!=-1) )
  281.         {
  282.         v=e->pos-t->pos;
  283.         f=v.length();
  284.         if (f<t->lookrange && f<t->enemydist)
  285.             {
  286.             v/=f;
  287.             if (flyengine->collision_test(flyengine->bsp,t->pos,e->pos,TYPE_STATIC_MESH))
  288.                 {
  289.                 flyengine->excludecollision=0;
  290.                 return;
  291.                 }
  292.  
  293.             t->enemydist=f;
  294.             t->enemy=e;
  295.             }
  296.         }
  297. }
  298.  
  299. void init_scene()
  300. {
  301.     bsp_object *obj;
  302.  
  303.     obj=0;
  304.     while( obj=flyengine->get_next_stock_object(obj,TYPE_MINE) )
  305.         if (((mine *)obj)->lookrange!=0.0f)
  306.             ((mine *)obj)->mine_find=mine_find;
  307.     obj=0;
  308.     while( obj=flyengine->get_next_stock_object(obj,TYPE_MISSILE) )
  309.         if (((missile *)obj)->lookrange!=0.0f)
  310.             ((missile *)obj)->missile_find=missile_find;
  311. }
  312.